home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / zusparam.c < prev    next >
C/C++ Source or Header  |  1997-04-13  |  15KB  |  573 lines

  1. /* Copyright (C) 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* zusparam.c */
  20. /* User and system parameter operators */
  21. #include "memory_.h"
  22. #include "string_.h"
  23. #include "ghost.h"
  24. #include "errors.h"
  25. #include "oper.h"
  26. #include "gscdefs.h"
  27. #include "gsstruct.h"        /* for gxht.h */
  28. #include "gsfont.h"        /* for user params */
  29. #include "gxht.h"        /* for user params */
  30. #include "gsutil.h"
  31. #include "estack.h"
  32. #include "ialloc.h"        /* for imemory for status */
  33. #include "idict.h"
  34. #include "idparam.h"
  35. #include "iparam.h"
  36. #include "dstack.h"
  37. #include "iname.h"
  38. #include "iutil2.h"
  39. #include "store.h"
  40.  
  41. /* The (global) font directory */
  42. extern gs_font_dir *ifont_dir;        /* in zfont.c */
  43.  
  44. /* Import the GC parameters from zvmem2.c. */
  45. extern int set_vm_reclaim(P1(long));
  46. extern int set_vm_threshold(P1(long));
  47.  
  48. /* The system passwords. */
  49. private password StartJobPassword = NULL_PASSWORD;
  50. password SystemParamsPassword = NULL_PASSWORD;    /* exported for ziodev2.c. */
  51.  
  52. /* Define an individual user or system parameter. */
  53. /* Eventually this will be made public. */
  54. #define param_def_common\
  55.     const char _ds *pname
  56. typedef struct param_def_s {
  57.     param_def_common;
  58. } param_def;
  59. typedef struct long_param_def_s {
  60.     param_def_common;
  61.     long min_value, max_value;
  62.     long (*current)(P0());
  63.     int (*set)(P1(long));
  64. } long_param_def;
  65. #if arch_sizeof_long > arch_sizeof_int
  66. #  define max_uint_param max_uint
  67. #else
  68. #  define max_uint_param max_long
  69. #endif
  70. typedef struct bool_param_def_s {
  71.     param_def_common;
  72.     bool (*current)(P0());
  73.     int (*set)(P1(bool));
  74. } bool_param_def;
  75. typedef struct string_param_def_s {
  76.     param_def_common;
  77.     void (*current)(P1(gs_param_string *));
  78.     int (*set)(P1(gs_param_string *));
  79. } string_param_def;
  80. /* Define a parameter set (user or system). */
  81. typedef struct param_set_s {
  82.     const long_param_def *long_defs;
  83.       uint long_count;
  84.     const bool_param_def *bool_defs;
  85.       uint bool_count;
  86.     const string_param_def *string_defs;
  87.       uint string_count;
  88. } param_set;
  89.  
  90. /* Forward references */
  91. private int setparams(P2(gs_param_list *, const param_set _ds *));
  92. private int currentparams(P2(os_ptr, const param_set _ds *));
  93. private int currentparam1(P2(os_ptr, const param_set _ds *));
  94.  
  95. /* ------ Passwords ------ */
  96.  
  97. #define plist ((gs_param_list *)&list)
  98.  
  99. /* <string|int> .checkpassword <0|1|2> */
  100. private int
  101. zcheckpassword(register os_ptr op)
  102. {    ref params[2];
  103.     array_param_list list;
  104.     int result = 0;
  105.     int code = name_ref((const byte *)"Password", 8, ¶ms[0], 0);
  106.  
  107.     if ( code < 0 )
  108.       return code;
  109.     params[1] = *op;
  110.     array_param_list_read(&list, params, 2, NULL, false);
  111.     if ( param_check_password(plist, &StartJobPassword) == 0 )
  112.       result = 1;
  113.     if ( param_check_password(plist, &SystemParamsPassword) == 0 )
  114.       result = 2;
  115.     iparam_list_release(&list);
  116.     make_int(op, result);
  117.     return 0;
  118. }
  119.  
  120. #undef plist
  121.  
  122. /* ------ System parameters ------ */
  123.  
  124. /* Integer values */
  125. private long
  126. current_BuildTime(void)
  127. {    return gs_buildtime;
  128. }
  129. private long
  130. current_MaxFontCache(void)
  131. {    return gs_currentcachesize(ifont_dir);
  132. }
  133. private int
  134. set_MaxFontCache(long val)
  135. {    return gs_setcachesize(ifont_dir,
  136.                    (uint)(val < 0 ? 0 : val > max_uint ? max_uint :
  137.                       val));
  138. }
  139. private long
  140. current_CurFontCache(void)
  141. {    uint cstat[7];
  142.     gs_cachestatus(ifont_dir, cstat);
  143.     return cstat[0];
  144. }
  145. private long
  146. current_MaxGlobalVM(void)
  147. {    gs_memory_gc_status_t stat;
  148.     gs_memory_gc_status(iimemory_global, &stat);
  149.     return stat.max_vm;
  150. }
  151. private int
  152. set_MaxGlobalVM(long val)
  153. {    gs_memory_gc_status_t stat;
  154.     gs_memory_gc_status(iimemory_global, &stat);
  155.     stat.max_vm = max(val, 0);
  156.     gs_memory_set_gc_status(iimemory_global, &stat);
  157.     return 0;
  158. }
  159. private long
  160. current_Revision(void)
  161. {    return gs_revision;
  162. }
  163. private const long_param_def system_long_params[] = {
  164.     {"BuildTime", 0, max_uint_param, current_BuildTime, NULL},
  165.     {"MaxFontCache", 0, max_uint_param, current_MaxFontCache, set_MaxFontCache},
  166.     {"CurFontCache", 0, max_uint_param, current_CurFontCache, NULL},
  167.     {"Revision", 0, max_uint_param, current_Revision, NULL},
  168.         /* Extensions */
  169.     {"MaxGlobalVM", 0, max_uint_param, current_MaxGlobalVM, set_MaxGlobalVM}
  170. };
  171. /* Boolean values */
  172. private bool
  173. current_ByteOrder(void)
  174. {    return !arch_is_big_endian;
  175. }
  176. private const bool_param_def system_bool_params[] = {
  177.     {"ByteOrder", current_ByteOrder, NULL}
  178. };
  179. /* String values */
  180. private void
  181. current_RealFormat(gs_param_string *pval)
  182. {
  183. #if arch_floats_are_IEEE
  184.     static const char *rfs = "IEEE";
  185. #else
  186.     static const char *rfs = "not IEEE";
  187. #endif
  188.     pval->data = (const byte *)rfs;
  189.     pval->size = strlen(rfs);
  190.     pval->persistent = true;
  191. }
  192. private const string_param_def system_string_params[] = {
  193.     {"RealFormat", current_RealFormat, NULL}
  194. };
  195.  
  196. /* The system parameter set */
  197. private const param_set system_param_set = {
  198.     system_long_params, countof(system_long_params),
  199.     system_bool_params, countof(system_bool_params),
  200.     system_string_params, countof(system_string_params)
  201. };
  202.  
  203. /* <dict> setsystemparams - */
  204. private int
  205. zsetsystemparams(register os_ptr op)
  206. {    int code;
  207.     dict_param_list list;
  208.     password pass;
  209.  
  210.     check_type(*op, t_dictionary);
  211.     code = dict_param_list_read(&list, op, NULL, false);
  212.     if ( code < 0 )
  213.       return code;
  214. #define plist ((gs_param_list *)&list)
  215.     code = param_check_password(plist, &SystemParamsPassword);
  216.     if ( code != 0 )
  217.       { if ( code > 0 )
  218.           code = gs_note_error(e_invalidaccess);
  219.         goto out;
  220.       }
  221.     code = param_read_password(plist, "StartJobPassword", &pass);
  222.     switch ( code )
  223.     {
  224.     default:            /* invalid */
  225.         goto out;
  226.     case 1:                /* missing */
  227.         break;
  228.     case 0:
  229.         StartJobPassword = pass;
  230.     }
  231.     code = param_read_password(plist, "SystemParamsPassword", &pass);
  232.     switch ( code )
  233.     {
  234.     default:            /* invalid */
  235.         goto out;
  236.     case 1:                /* missing */
  237.         break;
  238.     case 0:
  239.         SystemParamsPassword = pass;
  240.     }
  241.     code = setparams(plist, &system_param_set);
  242. out:    iparam_list_release(&list);
  243.     if ( code < 0 )
  244.       return code;
  245. #undef plist
  246.     pop(1);
  247.     return 0;
  248. }
  249.  
  250. /* - .currentsystemparams <name1> <value1> ... */
  251. private int
  252. zcurrentsystemparams(os_ptr op)
  253. {    return currentparams(op, &system_param_set);
  254. }
  255.  
  256. /* <name> .getsystemparam <value> */
  257. private int
  258. zgetsystemparam(os_ptr op)
  259. {    return currentparam1(op, &system_param_set);
  260. }
  261.  
  262. /* ------ User parameters ------ */
  263.  
  264. /* Integer values */
  265. private long
  266. current_JobTimeout(void)
  267. {    return 0;
  268. }
  269. private int
  270. set_JobTimeout(long val)
  271. {    return 0;
  272. }
  273. private long
  274. current_MaxFontItem(void)
  275. {    return gs_currentcacheupper(ifont_dir);
  276. }
  277. private int
  278. set_MaxFontItem(long val)
  279. {    return gs_setcacheupper(ifont_dir, val);
  280. }
  281. private long
  282. current_MinFontCompress(void)
  283. {    return gs_currentcachelower(ifont_dir);
  284. }
  285. private int
  286. set_MinFontCompress(long val)
  287. {    return gs_setcachelower(ifont_dir, val);
  288. }
  289. private long
  290. current_MaxOpStack(void)
  291. {    return ref_stack_max_count(&o_stack);
  292. }
  293. private int
  294. set_MaxOpStack(long val)
  295. {    return ref_stack_set_max_count(&o_stack, val);
  296. }
  297. private long
  298. current_MaxDictStack(void)
  299. {    return ref_stack_max_count(&d_stack);
  300. }
  301. private int
  302. set_MaxDictStack(long val)
  303. {    return ref_stack_set_max_count(&d_stack, val);
  304. }
  305. private long
  306. current_MaxExecStack(void)
  307. {    return ref_stack_max_count(&e_stack);
  308. }
  309. private int
  310. set_MaxExecStack(long val)
  311. {    return ref_stack_set_max_count(&e_stack, val);
  312. }
  313. private long
  314. current_MaxLocalVM(void)
  315. {    gs_memory_gc_status_t stat;
  316.     gs_memory_gc_status(iimemory_local, &stat);
  317.     return stat.max_vm;
  318. }
  319. private int
  320. set_MaxLocalVM(long val)
  321. {    gs_memory_gc_status_t stat;
  322.     gs_memory_gc_status(iimemory_local, &stat);
  323.     stat.max_vm = max(val, 0);
  324.     gs_memory_set_gc_status(iimemory_local, &stat);
  325.     return 0;
  326. }
  327. private long
  328. current_VMReclaim(void)
  329. {    gs_memory_gc_status_t gstat, lstat;
  330.     gs_memory_gc_status(iimemory_global, &gstat);
  331.     gs_memory_gc_status(iimemory_local, &lstat);
  332.     return (!gstat.enabled ? -2 : !lstat.enabled ? -1 : 0);
  333. }
  334. private long
  335. current_VMThreshold(void)
  336. {    gs_memory_gc_status_t stat;
  337.     gs_memory_gc_status(iimemory_local, &stat);
  338.     return stat.vm_threshold;
  339. }
  340. #define current_WaitTimeout current_JobTimeout
  341. #define set_WaitTimeout set_JobTimeout
  342. private long
  343. current_MinScreenLevels(void)
  344. {    return gs_currentminscreenlevels();
  345. }
  346. private int
  347. set_MinScreenLevels(long val)
  348. {    gs_setminscreenlevels((uint)val);
  349.     return 0;
  350. }
  351. private const long_param_def user_long_params[] = {
  352.     {"JobTimeout", 0, max_uint_param,
  353.        current_JobTimeout, set_JobTimeout},
  354.     {"MaxFontItem", 0, max_uint_param,
  355.        current_MaxFontItem, set_MaxFontItem},
  356.     {"MinFontCompress", 0, max_uint_param,
  357.        current_MinFontCompress, set_MinFontCompress},
  358.     {"MaxOpStack", 0, max_uint_param,
  359.        current_MaxOpStack, set_MaxOpStack},
  360.     {"MaxDictStack", 0, max_uint_param,
  361.        current_MaxDictStack, set_MaxDictStack},
  362.     {"MaxExecStack", 0, max_uint_param,
  363.        current_MaxExecStack, set_MaxExecStack},
  364.     {"MaxLocalVM", 0, max_uint_param,
  365.        current_MaxLocalVM, set_MaxLocalVM},
  366.     {"VMReclaim", -2, 0,
  367.        current_VMReclaim, set_vm_reclaim},
  368.     {"VMThreshold", 0, max_uint_param,
  369.        current_VMThreshold, set_vm_threshold},
  370.     {"WaitTimeout", 0, max_uint_param,
  371.        current_WaitTimeout, set_WaitTimeout},
  372.         /* Extensions */
  373.     {"MinScreenLevels", 0, max_uint_param,
  374.        current_MinScreenLevels, set_MinScreenLevels}
  375. };
  376. /* Boolean values */
  377. private bool
  378. current_AccurateScreens(void)
  379. {    return gs_currentaccuratescreens();
  380. }
  381. private int
  382. set_AccurateScreens(bool val)
  383. {    gs_setaccuratescreens(val);
  384.     return 0;
  385. }
  386. private const bool_param_def user_bool_params[] = {
  387.     {"AccurateScreens", current_AccurateScreens, set_AccurateScreens}
  388. };
  389. /* String values */
  390. private void
  391. current_JobName(gs_param_string *pval)
  392. {    pval->data = 0;
  393.     pval->size = 0;
  394.     pval->persistent = true;
  395. }
  396. private int
  397. set_JobName(gs_param_string *val)
  398. {    return 0;
  399. }
  400. private const string_param_def user_string_params[] = {
  401.     {"JobName", current_JobName, set_JobName}
  402. };
  403.  
  404. /* The user parameter set */
  405. private const param_set user_param_set = {
  406.     user_long_params, countof(user_long_params),
  407.     user_bool_params, countof(user_bool_params),
  408.     user_string_params, countof(user_string_params)
  409. };
  410.  
  411. /* <dict> setuserparams - */
  412. private int
  413. zsetuserparams(register os_ptr op)
  414. {    dict_param_list list;
  415.     int code;
  416.  
  417.     check_type(*op, t_dictionary);
  418.     code = dict_param_list_read(&list, op, NULL, false);
  419.     if ( code < 0 )
  420.       return code;
  421.     code = setparams((gs_param_list *)&list, &user_param_set);
  422.     iparam_list_release(&list);
  423.     if ( code < 0 )
  424.       return code;
  425.     pop(1);
  426.     return 0;
  427. }
  428.  
  429. /* - .currentuserparams <name1> <value1> ... */
  430. private int
  431. zcurrentuserparams(os_ptr op)
  432. {    return currentparams(op, &user_param_set);
  433. }
  434.  
  435. /* <name> .getuserparam <value> */
  436. private int
  437. zgetuserparam(os_ptr op)
  438. {    return currentparam1(op, &user_param_set);
  439. }
  440.  
  441. /* ------ Initialization procedure ------ */
  442.  
  443. BEGIN_OP_DEFS(zusparam_op_defs) {
  444.         /* User and system parameters are readable even in Level 1 */
  445.         /* (if this is a Level 2 system). */
  446.     {"0.currentsystemparams", zcurrentsystemparams},
  447.     {"0.currentuserparams", zcurrentuserparams},
  448.     {"1.getsystemparam", zgetsystemparam},
  449.     {"1.getuserparam", zgetuserparam},
  450.         /* The rest of the operators are defined only in Level 2. */
  451.         op_def_begin_level2(),
  452.     {"1.checkpassword", zcheckpassword},
  453.     {"1setsystemparams", zsetsystemparams},
  454.     {"1setuserparams", zsetuserparams},
  455. END_OP_DEFS(0) }
  456.  
  457. /* ------ Internal procedures ------ */
  458.  
  459. /* Set the values of a parameter set from a parameter list. */
  460. /* We don't attempt to back out if anything fails. */
  461. private int
  462. setparams(gs_param_list *plist, const param_set _ds *pset)
  463. {    int i, code;
  464.     for ( i = 0; i < pset->long_count; i++ )
  465.       {    const long_param_def *pdef = &pset->long_defs[i];
  466.         long val;
  467.         if ( pdef->set == NULL )
  468.           continue;
  469.         code = param_read_long(plist, pdef->pname, &val);
  470.         switch ( code )
  471.           {
  472.           default:            /* invalid */
  473.             return code;
  474.           case 1:            /* missing */
  475.             break;
  476.           case 0:
  477.             if ( val < pdef->min_value || val > pdef->max_value )
  478.               return_error(e_rangecheck);
  479.             code = (*pdef->set)(val);
  480.             if ( code < 0 )
  481.               return code;
  482.           }
  483.       }
  484.     for ( i = 0; i < pset->bool_count; i++ )
  485.       {    const bool_param_def *pdef = &pset->bool_defs[i];
  486.         bool val;
  487.         if ( pdef->set == NULL )
  488.           continue;
  489.         code = param_read_bool(plist, pdef->pname, &val);
  490.         if ( code == 0 )
  491.           code = (*pdef->set)(val);
  492.         if ( code < 0 )
  493.           return code;
  494.       }
  495.     /****** WE SHOULD DO STRINGS AND STRING ARRAYS, BUT WE DON'T YET ******/
  496.     return 0;
  497. }
  498.  
  499. /* Get the current values of a parameter set to the stack. */
  500. private int
  501. current_param_list(os_ptr op, const param_set _ds *pset,
  502.   const ref *psref /*t_string*/)
  503. {    stack_param_list list;
  504. #define plist ((gs_param_list *)&list)
  505.     int i;
  506.  
  507. #define pname_ok()\
  508.   (psref == 0 || !bytes_compare((const byte *)pname, strlen(pname),\
  509.                 psref->value.const_bytes, r_size(psref)))
  510.     stack_param_list_write(&list, &o_stack, NULL);
  511.     for ( i = 0; i < pset->long_count; i++ )
  512.       { const char _ds *pname = pset->long_defs[i].pname;
  513.         if ( pname_ok() )
  514.           { long val = (*pset->long_defs[i].current)();
  515.             int code = param_write_long(plist, pname, &val);
  516.  
  517.         if ( code < 0 )
  518.           return code;
  519.           }
  520.       }
  521.     for ( i = 0; i < pset->bool_count; i++ )
  522.       { const char _ds *pname = pset->bool_defs[i].pname;
  523.         if ( pname_ok() )
  524.           { bool val = (*pset->bool_defs[i].current)();
  525.         int code = param_write_bool(plist, pname, &val);
  526.  
  527.         if ( code < 0 )
  528.           return code;
  529.           }
  530.       }
  531.     for ( i = 0; i < pset->string_count; i++ )
  532.       { const char _ds *pname = pset->string_defs[i].pname;
  533.         if ( pname_ok() )
  534.           { gs_param_string val;
  535.         int code;
  536.  
  537.         (*pset->string_defs[i].current)(&val);
  538.         code = param_write_string(plist, pname, &val);
  539.         if ( code < 0 )
  540.           return code;
  541.           }
  542.       }
  543. #undef pname_ok
  544. #undef plist
  545.     return 0;
  546. }
  547.  
  548. /* Get the current values of a parameter set to the stack. */
  549. private int
  550. currentparams(os_ptr op, const param_set _ds *pset)
  551. {    return current_param_list(op, pset, NULL);
  552. }
  553.  
  554. /* Get the value of a single parameter to the stack, or signal an error. */
  555. private int
  556. currentparam1(os_ptr op, const param_set _ds *pset)
  557. {    ref sref;
  558.     int code;
  559.  
  560.     check_type(*op, t_name);
  561.     check_ostack(2);
  562.     name_string_ref((const ref *)op, &sref);
  563.     code = current_param_list(op, pset, &sref);
  564.     if ( code < 0 )
  565.       return code;
  566.     if ( osp == op )
  567.       return_error(e_undefined);
  568.     /* We know osp == op + 2. */
  569.     ref_assign(op, op + 2);
  570.     pop(2);
  571.     return code;
  572. }
  573.